package lz77.util;

/**
 * Kehäpuskuri
 * 
 * @author ossi
 * 
 */
public class LoopArray {
	private byte[] contents;
	public final char length;

	private int head;

	public LoopArray(char size) {
		contents = new byte[size];
		length = size;
		head = 0;
	}

	/**
	 * Palauttaa puskurin i:nnen arvon
	 * 
	 * @param i
	 *            Palautettavan arvon indeksi
	 * @return Kysytty arvo
	 */
	public byte get(int i) {
		// muunnetaan indeksi
		int tmp = head + i;
		while (tmp >= length) {
			tmp -= length;
		}
		return contents[tmp];
	}

	/**
	 * Työntää kaikkia alkioita yhden vasemmalle ja lisää arvon puskurin loppuun
	 * 
	 * @param b
	 *            lisättävä arvo
	 */
	public void push(byte b) {
		contents[head] = b;
		head++;
		if (head == length) {
			head = 0;
		}
	}

	/**
	 * Palauttaa osataulukon puskurin sisällöstä
	 * 
	 * @param start
	 *            osataulun alkulkohta
	 * @param length
	 *            osataulun pituus
	 * @return osataulu
	 */
	public byte[] getSlice(int start, int length) {
		byte[] result = new byte[length];
		for (int i = 0; i < length; i++) {
			// muunnetaan indeksi
			int tmp = head + i + start;
			while (tmp >= this.length) {
				tmp -= this.length;
			}
			result[i] = contents[tmp];
		}
		return result;
	}

	public String toString() {
		StringBuffer tmp = new StringBuffer();
		tmp.append('[');
		for (int i = 0; i < contents.length; i++) {
			tmp.append(((i == 0) ? "" : ","));
			if (get(i) < 10 && get(i) >= 0) {
				tmp.append("  ");
			} else if (get(i) < 100) {
				tmp.append(" ");
			}
			tmp.append(this.get(i));
			if (i == contents.length / 2) {
				tmp.append('|');
			}

		}
		tmp.append(']');
		return tmp.toString();
	}
}
